﻿using System;
using System.Collections.Generic;
using System.Windows;
using WPFSchematics.Definition.Common;

namespace WPFSchematics.Graphics.Ghosts
{
    /// <summary>
    /// 幻影类。
    /// </summary>
    public class GhostObject
    {
        /// <summary>
        /// 
        /// </summary>
        public int Index { get; set; }
        /// <summary>
        /// 幻影类型。
        /// </summary>
        public GhostType Type { get; set; }
        /// <summary>
        /// 成员持久化标记。用来支持幻影所有者对象与幻影所属集合的持久化标记。
        /// true，表示幻影所属集合完全持有该幻影所有者对象，控制该所幻影所有者对象的全部生命周期；
        /// false，表示幻影所有者集合部分持有该幻影所有者对象，仅维护集合添加、删除对象的动作。
        /// </summary>
        public bool SnapMode { get; set; }
        /// <summary>
        /// 幻影所有者（对象）。
        /// </summary>
        public IGhostHost ObserverHost { get; set; }
        /// <summary>
        /// 幻影所属集合属性的所有者。
        /// </summary>
        public IGhostHost CollectionPropertyOwner { get; set; }
        /// <summary>
        /// 幻影所属集合属性。
        /// </summary>
        public DependencyProperty CollectionProperty { get; set; }
        /// <summary>
        /// 幻影所属Restore。
        /// </summary>
        public GhostRestore Restore { get; set; }
        /// <summary>
        /// 幻影是否有效。
        /// </summary>
        public bool IsValid
        {
            get 
            {
                return ChildRestores.Count > 0 || ChildProperties.Count > 0;
            }
        }
        /// <summary>
        /// 成员Restore集合。
        /// </summary>
        public List<IGhostRestore> ChildRestores { get; set; }
        /// <summary>
        /// 属性集合。
        /// </summary>
        public Dictionary<DependencyProperty, TupleValues> ChildProperties { get; private set; }
        /// <summary>
        /// 构造。
        /// </summary>
        public GhostObject()
        {
            ChildRestores = new List<IGhostRestore>();
            SnapMode = true;
            Type = GhostType.Changed;
            ChildProperties = new Dictionary<DependencyProperty, TupleValues>();
            Index = -1;
        }
    }
        
    /// <summary>
    /// 属性值对类。用于记录依赖属性的新、旧值。
    /// </summary>
    public class TupleValues
    {
        /// <summary>
        /// 旧值。
        /// </summary>
        object _oldValue;
        /// <summary>
        /// 旧值。
        /// </summary>
        public object OldValue
        {
            get { return (_oldValue is Freezable)? ((Freezable)_oldValue).CloneCurrentValue():_oldValue; }
            set { _oldValue = value; }
        }
        /// <summary>
        /// 新值。
        /// </summary>
        object _newValue;
        /// <summary>
        /// 新值。
        /// </summary>
        public object NewValue
        {
            get { return (_newValue is Freezable) ? ((Freezable)_newValue).CloneCurrentValue() : _newValue; }
            set { _newValue = value; }
        }

        /// <summary>
        /// 构造。
        /// </summary>
        /// <param name="oldValue">旧值。当进行直接截取时，表示当前值。</param>
        public TupleValues(object oldValue)
        {
            _oldValue = oldValue;
        }
    }

    /// <summary>
    /// 幻影类型。
    /// </summary>
    public enum GhostType
    { 
        /// <summary>
        /// 新增。
        /// </summary>
        Added,
        /// <summary>
        /// 变更。
        /// </summary>
        Changed,
        /// <summary>
        /// 删除。
        /// </summary>
        Deleted
    }
}
